home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / Dictionary.C < prev    next >
C/C++ Source or Header  |  1990-11-23  |  4KB  |  250 lines

  1. #include "Dictionary.h"
  2. #include "Bag.h"
  3. #include "Error.h"
  4.  
  5. //---- a dictionary is implemented as a set of key,value associations 
  6.  
  7. MetaImpl(Assoc, (TP(key), TP(value), 0));
  8.  
  9. void Assoc::FreeAll()
  10. {
  11.     if (key) {
  12.     key->FreeAll();
  13.     delete key;
  14.     }
  15.     if (value) {
  16.     value->FreeAll();
  17.     delete value;
  18.     }
  19. }
  20.  
  21. unsigned long Assoc::Hash()
  22. {
  23.     return key->Hash();
  24. }
  25.  
  26. void Assoc::operator= (ObjPtr aValue)
  27. {
  28.     if (value) {
  29.     value->FreeAll();
  30.     delete value;
  31.     }
  32.     value = aValue;
  33. }
  34.  
  35. bool Assoc::IsEqual(ObjPtr anOp)
  36. {
  37.     return anOp->IsKindOf(Assoc) && key->IsEqual(((Assoc*) anOp)->key);
  38. }
  39.  
  40. int Assoc::Compare(ObjPtr anOp)
  41. {
  42.     return key->Compare(((Assoc*) anOp)->key);
  43. }
  44.  
  45. ostream& Assoc::PrintOn(ostream& s)
  46. {
  47.     Object::PrintOn(s);
  48.     return s << key SP << value SP;
  49. }
  50.   
  51. istream& Assoc::ReadFrom(istream& s)
  52. {
  53.     Object::ReadFrom(s);
  54.     return s >> key >> value;
  55. }
  56.  
  57. //---- Dictionary ------------------------------------------------------------
  58.  
  59. MetaImpl0(Dictionary);
  60.  
  61. Dictionary::Dictionary(int s) : Set(s)
  62. {
  63. }
  64.  
  65. Dictionary::~Dictionary()
  66. {
  67.     DictIter next(this);
  68.     ObjPtr op;
  69.  
  70.     while(op = next())
  71.     SafeDelete(op);
  72. }
  73.  
  74. void Dictionary::FreeAll()
  75. {
  76.     DictIter next(this);
  77.     ObjPtr op;
  78.  
  79.     while(op= next())
  80.     if (op)
  81.         op->FreeAll();
  82. }
  83.  
  84. void Dictionary::FreeValues()
  85. {
  86.     DictIter next(this);
  87.     Assoc *ap;
  88.     ObjPtr op;
  89.  
  90.     while(ap= (Assoc*)next()) {
  91.     if (ap) {
  92.         op= ap->Value();
  93.         SafeDelete(op);
  94.     }
  95.     }
  96.     Set::Empty(0);
  97. }
  98.  
  99. void Dictionary::Empty(int s)
  100. {
  101.     DictIter next(this);
  102.     ObjPtr op;
  103.  
  104.     while(op= next())
  105.     if (op)
  106.         SafeDelete(op);
  107.     Set::Empty(s);
  108. }
  109.  
  110. bool Dictionary::AssertAssoc(char *where, ObjPtr op)
  111. {
  112.     if (!op->IsKindOf(Assoc)) {
  113.     Error(where, "only Assoc's are allowed (%s)", op->ClassName());
  114.     return FALSE;
  115.     }  
  116.     return TRUE;
  117. }
  118.  
  119. ObjPtr Dictionary::Add(ObjPtr op)
  120. {
  121.     if (CheckNotNull("Add", op))
  122.     return 0;
  123.     if (!AssertAssoc("Add", op))
  124.     return 0;  
  125.     Assoc *tmp= (Assoc*) op;
  126.     Assoc *dp= (Assoc*) Find(tmp);
  127.     
  128.     if (dp == 0)
  129.     return Set::Add(tmp);
  130.     return dp->SetValue(tmp->Value());  
  131. }
  132.  
  133. ObjPtr Dictionary::Remove(ObjPtr op)
  134. {
  135.     if (op == 0)
  136.     return 0;
  137.     if (!AssertAssoc("Remove", op))
  138.     return 0;  
  139.     return Set::Remove(op);    
  140. }
  141.  
  142. void Dictionary::AtKeyPut(ObjPtr key,ObjPtr value)
  143. {
  144.     Assoc *dp;
  145.     
  146.     if (key == 0)
  147.     return;
  148.     if (value == 0) {
  149.     Error("AtKeyPut", "association with 0 not allowed");
  150.     return;
  151.     }
  152.     dp = AssociationAtKey(key);
  153.     
  154.     if (dp == 0)
  155.     Set::Add (new Assoc (key,value));
  156.     else
  157.     dp->SetValue(value);
  158. }
  159.  
  160. ObjPtr Dictionary::AtKey(ObjPtr key)
  161. {
  162.     Assoc *dp = AssociationAtKey(key);
  163.     return (dp == 0) ? 0 : dp->Value();
  164. }
  165.  
  166. Assoc* Dictionary::AssociationAtKey(ObjPtr key)
  167. {
  168.     Assoc tmp(key, 0);
  169.     
  170.     return (key == 0) ? 0 : (Assoc*) Find(&tmp);
  171. }
  172.  
  173. ObjPtr Dictionary::RemoveKey(ObjPtr key)
  174. {
  175.     return Remove(AssociationAtKey(key));
  176. }
  177.  
  178. bool Dictionary::Contains(ObjPtr op)                                         
  179. {
  180.     return Collection::Contains(op);
  181. }
  182.  
  183. bool Dictionary::ContainsAssoc (ObjPtr op)
  184. {
  185.     if (!AssertAssoc("ContainsAssoc", op))
  186.     return FALSE;  
  187.     if (op == 0)
  188.     return (FALSE);        
  189.  
  190.     return (Assoc*)Find(op) != 0;
  191. }
  192.  
  193. bool Dictionary::ContainsKey (ObjPtr op) 
  194. {
  195.     return AssociationAtKey(op) != 0;
  196. }
  197.  
  198. int Dictionary::OccurrencesOfKey (ObjPtr op)
  199. {
  200.     return (AssociationAtKey(op) != 0) ? 1 : 0;
  201. }
  202.  
  203. SetPtr Dictionary::Keys()
  204. {
  205.     register ObjPtr op;
  206.     register SetPtr sp = new Set;    
  207.     DictIterKeys next(this);
  208.     
  209.     while (op = next())
  210.     sp->Add(op);
  211.     return sp;
  212. }
  213.  
  214. BagPtr Dictionary::Values()
  215. {
  216.     register ObjPtr op;
  217.     register BagPtr bp = new Bag;    
  218.     DictIterValues next(this);
  219.     
  220.     while (op = next())
  221.     bp->Add(op);
  222.     return (bp);
  223. }
  224.  
  225. //---- DictIterValues ----------------------------------------------------------
  226.  
  227. DictIterValues::DictIterValues(Collection *s) : SetIter(s)
  228. {
  229. }
  230.  
  231. ObjPtr DictIterValues::operator()()
  232. {        
  233.     Assoc *ap= (Assoc*) SetIter::operator()();
  234.     
  235.     return (ap == 0) ? 0 : ap->Value();
  236. }
  237.  
  238. //---- DictIterKeys ------------------------------------------------------------
  239.  
  240. DictIterKeys::DictIterKeys(Collection *s) : SetIter(s)
  241. {
  242. }
  243.  
  244. ObjPtr DictIterKeys::operator()()
  245. {  
  246.     Assoc *ap= (Assoc*)SetIter::operator()();
  247.     return (ap == 0) ? 0 : ap->Key();
  248. }
  249.  
  250.